package com.sisgesbyte.dao.seguridad;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.AccesoHostDetRequest;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.entity.seguridad.AccesoHostListEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class MantenimientoAccesoHostDaoImpl extends AbstractFacade<AccesoHostListEntity> implements MantenimientoAccesoHostDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;
	
	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}
	
	public MantenimientoAccesoHostDaoImpl(){
		super(AccesoHostListEntity.class);
	}
	@Override
	public List<AccesoHostListEntity> listaAccesoHost(FiltrosSQLBean cadenaFiltros) {
		
		StringBuilder jpql = new StringBuilder();
		jpql.append("select ah.id, ah.usuario_id, u.usuario, ah.locales_id,l.cod_local, ah.ip_estatica, ah.mac_pc, ah.active ");
		jpql.append("from seguridad.acceso_host ah ");
		jpql.append("inner join seguridad.usuario u on ah.usuario_id =u.id ");
		jpql.append("inner join sistema.locales l on ah.locales_id=l.id ");

		// concatenamos el filtro
		if (cadenaFiltros != null) {
			StringBuilder filtro = new StringBuilder();
			filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
			jpql.append(filtro.toString());
		}
		Query query = em.createNativeQuery(jpql.toString(),AccesoHostListEntity.class);
		if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
				&& cadenaFiltros.getListaValores().size() > 0) {
			int num = 0;
			for (Object valor : cadenaFiltros.getListaValores()) {
				query.setParameter(++num, valor);
			}
		}
		List<AccesoHostListEntity> ls = query.getResultList();
		
		return ls;
	}

	@Override
	public GenericEntity guardarAccesoHost(AccesoHostDetRequest request) {
		
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from seguridad.sp_registrar_acceso_host (:in_usuarioid, :in_localid, :in_ipestatica, :in_macpc, :in_active)");
	
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_usuarioid", request.getCodUsuario());
		query.setParameter("in_localid", request.getIdLocal());
		query.setParameter("in_ipestatica", request.getIpEstatica());
		query.setParameter("in_macpc", request.getMac());
		query.setParameter("in_active", request.getActive());
		
		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity actualizarAccesoHost(AccesoHostDetRequest request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from seguridad.sp_actualizar_acceso_host (:in_id, :in_usuarioid, :in_localid, :in_ipestatica, :in_macpc, :in_active)");
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
			query.setParameter("in_id", request.getId());
			query.setParameter("in_usuarioid", request.getCodUsuario());
			query.setParameter("in_localid", request.getIdLocal());
			query.setParameter("in_ipestatica", request.getIpEstatica());
			query.setParameter("in_macpc", request.getMac());
			query.setParameter("in_active", request.getActive());
			
		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity eliminarAccesoHost(int codAccesoHost) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from seguridad.sp_eliminar_acceso_host (:in_id)");
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_id", codAccesoHost);

		return (GenericEntity) query.getSingleResult();
	}

}
